package io.renren.system.sys.service.impl;

import io.renren.common.service.impl.BaseServiceImpl;
import io.renren.common.utils.ConvertUtils;
import io.renren.system.security.user.SecurityUser;
import io.renren.system.security.user.UserDetail;
import io.renren.system.sys.dao.SysRegionDao;
import io.renren.system.sys.dto.SysRegionDTO;
import io.renren.system.sys.entity.SysRegionEntity;
import io.renren.system.sys.enums.SuperAdminEnum;
import io.renren.system.sys.service.SysRegionService;
import io.renren.common.utils.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * 系统设置-地区管理
 */
@Service
public class SysRegionServiceImpl extends BaseServiceImpl<SysRegionDao, SysRegionEntity> implements SysRegionService {

    //根地区标识
    private String ROOT_REGION = "000000";

    /**
     * 根据主键获取地区区域详细信息
     *
     * @param id
     * @return
     */
    @Override
    public SysRegionDTO get(Long id) {
        SysRegionEntity entity = baseDao.selectById(id);
        return ConvertUtils.sourceToTarget(entity, SysRegionDTO.class);
    }

    /**
     * 新增保存地区区域信息
     *
     * @param dto
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void save(SysRegionDTO dto) {
        SysRegionEntity entity = ConvertUtils.sourceToTarget(dto, SysRegionEntity.class);
        baseDao.insert(entity);
    }

    /**
     * 修改保存地区区域信息
     *
     * @param dto
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(SysRegionDTO dto) {
        SysRegionEntity entity = ConvertUtils.sourceToTarget(dto, SysRegionEntity.class);
        baseDao.updateById(entity);
    }

    /**
     * 根据主键删除地区区域信息
     *
     * @param ids
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long[] ids) {
        baseDao.deleteBatchIds(Arrays.asList(ids));
    }

    /**
     * 获取指定区域详细信息
     *
     * @param regionid
     * @return
     */
    @Override
    public SysRegionEntity selectRegion(String regionid) {
        return baseDao.selectRegion(regionid);
    }

    /**
     * 获取指定区域的上级区域详细信息
     *
     * @param regionid
     * @return
     */
    @Override
    public SysRegionEntity getParentRegionid(String regionid) {
        String parentRegionid = this.getParentId(regionid);//获取上级区域标识
        return baseDao.selectRegion(parentRegionid);
    }

    /**
     * 获取指定区域的子级区域列表
     *
     * @param regionid
     * @return
     */
    @Override
    public List<SysRegionEntity> getChildrenRegionid(String regionid) {
        return this.getRegionsByRegionid(regionid, null);
    }

    /**
     * 获取指定区域列表或子区域列表
     *
     * @param regionid
     * @param firstInto
     * @return
     */
    @Override
    public List<SysRegionDTO> loadList(String regionid, Integer firstInto) {
        if (StringUtils.isEmpty(regionid)) {
            UserDetail userDetail = SecurityUser.getUser();
            if (userDetail.getSuperAdmin() == SuperAdminEnum.NO.value()) {//非超管
                regionid = userDetail.getRegionId();
            } else {
                regionid = this.ROOT_REGION;
            }
        }
        List<SysRegionEntity> entityList = this.getRegionsByRegionid(regionid, firstInto);

        List<SysRegionDTO> dtoList = new ArrayList<>(entityList.size());
        SysRegionDTO dto = null;
        for (SysRegionEntity entity : entityList) {
            dto = new SysRegionDTO();
            BeanUtils.copyProperties(entity, dto);
            dto.setHasChildren(entity.getHashchildarea() != 1);
            dtoList.add(dto);
        }
        return dtoList;
    }

    /**
     * 获取指定区域列表或子区域列表(超管获取全部)
     *
     * @param regionid
     * @param firstInto
     * @return
     */
    @Override
    public List<SysRegionEntity> getRootRegionsByRegionid(String regionid, Integer firstInto) {
        if (StringUtils.isEmpty(regionid)) {
            UserDetail userDetail = SecurityUser.getUser();
            if (userDetail.getSuperAdmin() == SuperAdminEnum.NO.value()) {//非超管
                regionid = userDetail.getRegionId();
            } else {
                regionid = this.ROOT_REGION;
            }
        }
        return this.getRegionsByRegionid(regionid, firstInto);
    }


    /**
     * 获取指定区域列表或子区域列表
     *
     * @param regionid
     * @param firstInto
     * @return
     */
    @Override
    public List<SysRegionEntity> getRegionsByRegionid(String regionid, Integer firstInto) {
        int length = 0;
        if (StringUtils.isEmpty(regionid)) {// 当传入的区域标识为空的时候，设置为当前登录者所属区划
            regionid = SecurityUser.getUser().getRegionId();
        }
        if (StringUtils.isEmpty(regionid)) {//有可能当前登录者所属区划为空，为防止空指针异常，设置其为空字符串
            regionid = "";
        }

        Map<String, Object> params = new HashMap<>();
        // 说明第一次加载加载省级信息
        if (this.ROOT_REGION.equals(regionid)) {
            regionid = "";
            length = 2;
        } else {
            if (firstInto != null && firstInto == 1) {//第一次进入
                if (regionid.length() == 6 || regionid.length() == 9) {
                    length = regionid.length();
                } else {
                    length = regionid.length();
                }
            } else {
                if (regionid.length() == 6 || regionid.length() == 9) {
                    length = regionid.length() + 3;
                } else {
                    length = regionid.length() + 2;
                }
            }
        }
        params.put("regionid", regionid);
        params.put("length", length);
        return baseDao.findRegionsByRegionid(params);
    }

    /**
     * 获取地区全部列表转换为id和pid
     *
     * @return
     */
    @Override
    public List<Map<String, Object>> getTreeList() {
        return baseDao.getTreeList();
    }

    /**
     * 获取指定区域名称
     *
     * @param regionid
     * @return
     */
    @Override
    public String getRegionName(String regionid) {
        String regionName = "";
        SysRegionEntity entity = this.selectRegion(regionid);
        if (StringUtils.isNotEmpty(entity)) {
            regionName = entity.getRegname();
        }
        return regionName;
    }

    /**
     * 格式化指定区域标识的上级区域标识
     *
     * @param regionid
     * @return
     */
    private String getParentId(String regionid) {
        if (StringUtils.isNotEmpty(regionid)) {
            if (regionid.length() >= 14) {
                return regionid.substring(0, 12);
            }
            if (regionid.length() >= 12) {
                return regionid.substring(0, 9);
            }
            if (regionid.length() >= 9) {
                return regionid.substring(0, 6);
            }
            if (regionid.length() >= 6) {
                return regionid.substring(0, 4);
            }
            if (regionid.length() >= 4) {
                return regionid.substring(0, 2);
            }
        }
        return "";
    }
}
